home *** CD-ROM | disk | FTP | other *** search
/ Chip 2002 February / CHIPCD_02_2002.iso / Internet / Macromedia ColdFusion Server 5 / coldfusion-50-win-us.exe / Redistrib / AdvSecurity / data1.cab / AdvancedSecurity / BIN / soxml.cfm (.txt) < prev    next >
Encoding:
ColdFusion Encrypted Template  |  2001-05-24  |  11.4 KB  |  383 lines

  1. <cfsetting enablecfoutputonly="Yes">
  2. <!------------------------------------------------------------------------------
  3.   Custom Tag: SOXML;
  4.     Author: Brett Suwyn; mailto:brett@suwyn.com
  5.     Created: 8/18/2000;
  6.   Description: 
  7.     This tag is a simple to use XML interface for ColdFusion;
  8.   Usage: 
  9.     <cf_SOXML
  10.       action="CF2XMLDom|CF2XML|XML2CF|XML2DOM|XML2HTML"
  11.       input="" [required:all actions]
  12.       output="" [required:CF2XMLDom|CF2XML|XML2CF|XML2DOM]
  13.       type="" [required:XML2CF|XML2DOM]
  14.       rootname="" [required:CF2XMLDom|CF2XML]
  15.       progid="" [optional] 
  16.     >
  17.   
  18.   Modifications:
  19.     10/23/2000: Fixed loss of root level name when using XML2CF
  20.       
  21.     
  22. ---------------------------------------------------------------------------------->
  23.  
  24. <cfparam name="Attributes.ProgId" default="Microsoft.XMLDom">
  25.  
  26.  
  27. <cfswitch expression="#Attributes.Action#">
  28.  
  29. <!--- ~~~CF2XMLDOM~~~ --->
  30. <!--- Build XML Dom object --->
  31. <!--- ~~~~~~~~~~~~~~ --->
  32. <cfcase value="CF2XMLDOM">
  33.  
  34. <cfparam name="Attributes.Init" default="1">
  35.  
  36. <cfif Attributes.Init>
  37.   <cfparam name="Attributes.Output" type="string">  
  38.   <cfparam name="Attributes.Input">
  39.   <cfparam name="Attributes.RootName" default="ROOT">
  40.   
  41.   <cfobject action="CREATE" class="#Attributes.ProgId#" type="COM" name="Request.XMLDoc">
  42.   
  43.   <cfscript>
  44.     Request.XMLDoc.async = 0;
  45.     Request.XMLDoc.loadXML("<?xml version=""1.0""?>" & "<" & UCase(Attributes.RootName) & ">" & "</" & UCase(Attributes.RootName) & ">");
  46.     Attributes.Node = Request.XMLdoc.documentElement;
  47.     oParseError = Request.XMLDoc.ParseError;
  48.   </cfscript>
  49.   
  50.   <!--- if DOM error throw an exception --->
  51.   <cfif oParseError.ErrorCode>
  52.     <cfthrow type="SOXML.ParseError" message="DOM Error" detail="#oParseError.Reason# | Line:#oParseError.Line#">
  53.   </cfif>
  54.   
  55. </cfif>
  56.    
  57. <cfif isStruct(Attributes.Input)>
  58.  
  59.   <cfloop collection="#Attributes.Input#" item="Key">
  60.  
  61.     <cfscript>
  62.       ndKey = Request.xmlDoc.createNode (1, UCase(Key),"");
  63.       Attributes.Node.appendChild(ndKey); 
  64.       vCurrent = Attributes.Input[Key];
  65.     </cfscript>
  66.     
  67.     <cf_SOXML action="CF2XMLDOM" init="0" input="#vCurrent#" node="#ndKey#">
  68.  
  69.   </cfloop>
  70.  
  71. <cfelseif isQuery(Attributes.Input)>
  72.  
  73.   <cfloop query="Attributes.Input">
  74.   
  75.     <cfscript>
  76.       ndRow = Request.xmlDoc.createNode (1, "ROW","");
  77.       Attributes.Node.appendChild(ndRow);    
  78.     </cfscript>
  79.   
  80.     <cfloop index="idx" list="#Attributes.Input.ColumnList#">
  81.   
  82.       <cfscript>
  83.         ndColumn = Request.xmlDoc.createNode (1, UCase(idx),"");
  84.         ndRow.appendChild(ndColumn);  
  85.       </cfscript>
  86.   
  87.       <cf_SOXML action="CF2XMLDOM" init="0" input="#Evaluate(idx)#" node="#ndColumn#">    
  88.   
  89.     </cfloop>
  90.   
  91.   </cfloop>
  92.  
  93. <cfelseif isArray(Attributes.Input)>
  94.  
  95.   <cfloop index="idx" from="1" to="#ArrayLen(Attributes.Input)#">
  96.   
  97.     <cfscript>
  98.       ndArray = Request.xmlDoc.createNode (1, "IDX","");
  99.       Attributes.Node.appendChild(ndArray);    
  100.     </cfscript>
  101.    
  102.     <cf_SOXML action="CF2XMLDOM" init="0" input="#Attributes.Input[idx]#" node="#ndArray#">    
  103.   
  104.   </cfloop>  
  105.   
  106. <cfelseif isSimpleValue(Attributes.Input)>
  107.  
  108.   <cfscript>
  109.     if (ReFind("<|>|&|'|""",Attributes.Input))
  110.       ndSimple = Request.xmlDoc.createNode(4, "", "");
  111.     else
  112.       ndSimple = Request.xmlDoc.createNode(3, "", "");
  113.     ndSimple.text = Attributes.Input;
  114.     
  115.     Attributes.Node.appendChild(ndSimple);
  116.   </cfscript>
  117.     
  118. </cfif>
  119.  
  120. <cfscript>
  121.   if (Attributes.Init){
  122.     SetVariable("Caller."&Attributes.Output,Request.XMLDoc);    
  123.   }
  124. </cfscript>
  125.  
  126. </cfcase>
  127.  
  128. <!--- ~~~CF2XML~~~ --->
  129. <!--- Build XML string --->
  130. <!--- ~~~~~~~~~~~ --->
  131. <cfcase value="CF2XML">
  132.  
  133. <cfparam name="Attributes.Input">
  134. <cfparam name="Attributes.Init" default="1">
  135. <cfparam name="Attributes.RootName" default="ROOT">
  136.  
  137.  
  138. <cfif Attributes.Init>
  139.  
  140.   <cfparam name="Attributes.Output" type="string"> 
  141.  
  142.   <cfset Request.XMLDoc = "<?xml version=""1.0""?>" & "<" & UCase(Attributes.RootName) & ">">
  143.    
  144. </cfif>
  145.  
  146. <cfif isStruct(Attributes.Input)>
  147.  
  148.   <cfloop collection="#Attributes.Input#" item="Key">
  149.  
  150.     <cfset Request.XMLDoc = Request.XMLDoc & "<" & Key & ">">
  151.     
  152.     <cf_SOXML action="CF2XML" init="0" input="#Attributes.Input[Key]#">  
  153.   
  154.     <cfset Request.XMLDoc = Request.XMLDoc & "</" & Key & ">">    
  155.   
  156.   </cfloop>
  157.  
  158. <cfelseif isQuery(Attributes.Input)>
  159.  
  160.   <cfloop query="Attributes.Input">
  161.  
  162.     <cfset Request.XMLDoc = Request.XMLDoc & "<ROW>">  
  163.  
  164.     <cfloop index="idx" list="#Attributes.Input.ColumnList#">
  165.        
  166.       <cfset Request.XMLDoc = Request.XMLDoc &  "<" & idx & ">">         
  167.       
  168.       <cf_SOXML action="CF2XML" init="0" input="#Evaluate(idx)#">      
  169.  
  170.       <cfset Request.XMLDoc = Request.XMLDoc & "</" & idx & ">">  
  171.  
  172.     </cfloop>
  173.  
  174.     <cfset Request.XMLDoc = Request.XMLDoc & "</ROW>">  
  175.  
  176.   </cfloop>
  177.   
  178. <cfelseif isArray(Attributes.Input)>
  179.  
  180.   <cfloop index="idx" from="1" to="#ArrayLen(Attributes.Input)#">
  181.  
  182.     <cfset Request.XMLDoc = Request.XMLDoc & "<IDX>">  
  183.        
  184.     <cf_SOXML action="CF2XML" init="0" input="#Attributes.Input[idx]#">      
  185.  
  186.     <cfset Request.XMLDoc = Request.XMLDoc & "</IDX>">  
  187.  
  188.   </cfloop>
  189.  
  190. <cfelseif isSimpleValue(Attributes.Input)>
  191.  
  192.   <cfscript>
  193.     if (ReFind("<|>|&|'|""", Attributes.Input))
  194.       Request.XMLDoc = Request.XMLDoc & "<![CDATA[" & Attributes.Input & "]]>";
  195.     else
  196.       Request.XMLDoc = Request.XMLDoc & Attributes.Input;
  197.   </cfscript>
  198.  
  199. </cfif>
  200.  
  201. <cfscript>
  202.   if (Attributes.Init){
  203.     Request.XMLDoc = Request.XMLDoc & "</" & UCase(Attributes.RootName) & ">";  
  204.     SetVariable("Caller."&Attributes.Output ,Request.XMLDoc);    
  205.   }
  206. </cfscript>
  207.  
  208. </cfcase>
  209.  
  210. <!--- ~~~~~XML2CF~~~~~~~ --->
  211. <!--- Build CF object from XML --->
  212. <!--- ~~~~~~~~~~~~~~~~ --->
  213. <cfcase value="XML2CF">
  214.  
  215.   <cfparam name="Attributes.Init" default="1">
  216.   
  217.   <cfif Attributes.Init>
  218.     <cfparam name="Attributes.Input">
  219.     <cfparam name="Attributes.Output" default="Struct">
  220.     <cfparam name="Attributes.Type" default="Variable">   
  221.     
  222.     <cfobject action="CREATE" class="#Attributes.ProgId#" type="COM" name="XMLDoc">
  223.     <cfscript>
  224.       XMLDoc.async = 0;
  225.       if (Attributes.Type eq "File") 
  226.         XMLDoc.Load(Attributes.Input);
  227.       else 
  228.         XMLDoc.loadXML(Attributes.Input);
  229.       oParseError = XMLDoc.ParseError;
  230.     </cfscript>
  231.   
  232.     <!--- if DOM error throw an exception --->
  233.     <cfif oParseError.ErrorCode>
  234.       <cfthrow type="SOXML.ParseError" message="DOM Error" detail="#oParseError.Reason# | Line:#oParseError.Line#">
  235.     </cfif>
  236.     
  237.     <cfscript>
  238.       Attributes.Node = XMLDoc;
  239.       Attributes.Struct = StructNew();
  240.     </cfscript>
  241.   </cfif>
  242.   
  243.   <cfloop collection="#Attributes.Node.childNodes#" item="ThisNode">
  244.     <cfswitch expression="#ThisNode.NodeType#">
  245.     <cfcase value="1">
  246.       <cfset CurrentNode = StructNew()> <!---  initialize node structure --->
  247.   
  248.       <!--- Write Attributes to Structure --->
  249.       <cfset CurrentNode["Attributes"] = StructNew()>
  250.       <cfloop collection="#ThisNode.Attributes#" item="ThisAttribute">
  251.         <cfset CurrentNode.Attributes[ThisAttribute.Name] = ThisAttribute.Value>
  252.       </cfloop> 
  253.       <cfif StructIsEmpty(CurrentNode["Attributes"])>
  254.         <cfset StructDelete(CurrentNode,"Attributes")>
  255.       </cfif>
  256.       
  257.       <!--- Write current node to Structure --->
  258.       <cfscript>
  259.         if(isArray(Attributes.Struct)) // Currently part of a collection
  260.           Attributes.Struct[ArrayLen(Attributes.Struct)+1] = CurrentNode;
  261.         else if(structKeyExists(Attributes.Struct,ThisNode.NodeName)){ // Duplicate keys found
  262.           if (isArray(Attributes.Struct[ThisNode.NodeName]))  // Collection already exists
  263.             Attributes.Struct[ThisNode.NodeName][ArrayLen(Attributes.Struct[ThisNode.NodeName])+1] = CurrentNode;
  264.           else{ // Create new collection
  265.             TempCollection = ArrayNew(1);
  266.             TempCollection[1] = Attributes.Struct[ThisNode.NodeName];
  267.             TempCollection[2] = CurrentNode;
  268.             Attributes.Struct[ThisNode.NodeName] = TempCollection; 
  269.           }
  270.         }else // Single element
  271.           Attributes.Struct[ThisNode.NodeName] = CurrentNode; 
  272.       </cfscript>
  273.       
  274.       <!--- Recurse if children nodes exist --->
  275.       <cfif ThisNode.hasChildNodes()>
  276.         <cf_SOXML action="XML2CF" init="0" struct="#CurrentNode#" node="#ThisNode#">
  277.       <cfelse>
  278.         <cfset CurrentNode.Value = "">
  279.       </cfif>    
  280.       
  281.     </cfcase>
  282.     <cfcase value="3,4">
  283.       <cfset Attributes.Struct.Value = ThisNode.NodeValue>
  284.     </cfcase>
  285.     <cfcase value="8">
  286.       <cfset Attributes.Struct.Comment = ThisNode.NodeValue>
  287.     </cfcase>
  288.     </cfswitch>
  289.   </cfloop>
  290.  
  291.   <cfif Attributes.Init>
  292.   <!--- Return the new structure to the calling template --->
  293.   <cfset "Caller.#Attributes.Output#"= Attributes.Struct>
  294.   </cfif>
  295. </cfcase>
  296.  
  297. <!--- ~~~~~XML2DOM~~~~ --->
  298. <!--- Loads XML into DOM      --->
  299. <!--- ~~~~~~~~~~~~~~~~ --->
  300. <cfcase value="XML2DOM">
  301.  
  302.   <cfparam name="Attributes.Output">
  303.   <cfparam name="Attributes.Input">
  304.   <cfparam name="Attributes.Type" default="Variable">
  305.   
  306.   <cfobject action="CREATE" class="#Attributes.ProgId#" type="COM" name="XMLDoc">
  307.   
  308.   <cfscript>
  309.       XMLDoc.async = 0;
  310.       if (Attributes.Type eq "File")
  311.         XMLDoc.Load(Attributes.Input);
  312.       else
  313.         XMLDoc.loadXML(Attributes.Input);
  314.       oParseError = XMLDoc.ParseError;
  315.   </cfscript>
  316.   
  317.   <cfif oParseError.ErrorCode>
  318.     <cfthrow type="SOXML.ParseError" message="DOM Error" detail="#oParseError.Reason# | Line:#oParseError.Line#">
  319.   </cfif>
  320.     
  321.   <cfset "Caller.#Attributes.Output#"= XMLDoc>
  322.  
  323. </cfcase>
  324.  
  325. <!--- ~~~~~XML2HTML~~~~~~~ --->
  326. <!--- Output XML to HTML inline    --->
  327. <!--- ~~~~~~~~~~~~~~~~~~~ --->
  328. <cfcase value="XML2HTML">
  329.  
  330.   <cfparam name="Attributes.Input">
  331.   <cfparam name="Attributes.Type" default="Variable">
  332.   
  333.   <cfobject action="CREATE" class="#Attributes.ProgId#" type="COM" name="XSLDump">
  334.  
  335.   <cfscript>
  336.       XSLDump.async = 0;     
  337.       XSLDump.Load("http://www.siteobjects.com/downloads/soxml.xsl");       
  338.       oParseError = XSLDump.ParseError;
  339.   </cfscript>
  340.  
  341.   <cfif oParseError.ErrorCode>
  342.     <cfthrow type="SOXML.ParseError" message="DOM Error" detail="#oParseError.Reason# | Line:#oParseError.Line#">
  343.   </cfif>
  344.      
  345.   <cfif isSimpleValue(Attributes.Input)>
  346.  
  347.     <cfobject action="CREATE" class="#Attributes.ProgId#" type="COM" name="XMLDump">
  348.  
  349.     <cfscript>
  350.       XMLDump.async = 0;
  351.       if (Attributes.Type eq "File") 
  352.         XMLDump.Load(Attributes.Input);
  353.       else 
  354.         XMLDump.loadXML(Attributes.Input);
  355.       oParseError = XMLDump.ParseError;
  356.     </cfscript>
  357.     
  358.     <cfif oParseError.ErrorCode>
  359.       <cfthrow type="SOXML.ParseError" message="DOM Error" detail="#oParseError.Reason# | Line:#oParseError.Line#">
  360.     </cfif>     
  361.  
  362.   <cfelse>
  363.   
  364.     <cfset XMLDump = Attributes.Input>
  365.   
  366.   </cfif>
  367.   
  368.   <cfscript>
  369.      strValue = XMLDump.transformNode(XSLDump);
  370.      WriteOutput(strValue);
  371.   </cfscript>
  372.  
  373. </cfcase>
  374.  
  375. <!--- ~~INVALID ACTION~~ --->
  376. <!---        Throw error           --->
  377. <!--- ~~~~~~~~~~~~~~~ --->
  378. <cfdefaultcase>
  379.   <cfthrow type="SOXML.Error" message="cf_SOXML Error" detail="Invalid action">
  380. </cfdefaultcase>
  381.  
  382. </cfswitch>
  383. <cfsetting enablecfoutputonly="No">